package linyunshi.rbac.service.array;

import linyunshi.rbac.domain.dto.DeptDto;
import linyunshi.rbac.domain.entity.Dept;
import linyunshi.rbac.domain.vo.DeptVo;
import linyunshi.rbac.domain.vo.Result;
import linyunshi.rbac.service.IDeptService;
import linyunshi.rbac.service.IUserService;

/**
 * 业务层-部门
 *
 * @author linyunshi
 * @since 2025/6/3 12:16
 */

//业务层的实现
public class DeptService extends BaseService<Dept,DeptDto,DeptVo> implements IDeptService {

    /**
     * 保证类只有唯一的作用对象。
     */
    private IUserService userService;

    //私有的静态接口：避免外部的类使用/引用。
    private static IDeptService singleton;

    private DeptService() {
        data = new Dept[DATA_SIZE + 1];
        temp = new DeptVo[DATA_SIZE];
    }

    public static IDeptService getInstance() {
        if( singleton == null ) {
            singleton = new DeptService();
        }
        return singleton;
    }



    /**
     * 将Dept对象转换为DeptVo对象。
     * 作用：通过将实体对象转化为视图对象。
     */
    @Override
    DeptVo convertToVo(Dept dept) {
        return new DeptVo(dept.getId(),dept.name,dept.phone);
    }

    //封装dto。从创建一个entity的过程。
    @Override
    Dept createEntity(DeptDto dto , int id) {
        return new Dept(id,dto.name,dto.phone);
    }

    @Override
    void updateEntity(DeptDto dto,Dept dept) {
        dept.name = dto.name;
        dept.phone = dto.phone;
    }

    /**
     * 删除部门信息
     * 视图层仅能看到id，所以这里的参数是id。
     */
    @Override
    public Result delete (int id) {
        //判断id是否存在
        if(!existsById(id)) {
            return linyunshi.rbac.domain.vo.Result.failure("删除失败，不存在该数据");
        }

        if(userService == null) {
            userService = UserService.getInstance();
        }

        //判断是否能删除
        if(userService.deptInUse(id)) {
            return linyunshi.rbac.domain.vo.Result.failure("删除失败，还有用户属于该部门,不能删除");
        }
        data[id] = null;//将该id对应的数据置为null。（存在时）
        return Result.success("删除成功", null);
    }
}
